A debugger is a tool which enables a programmer to monitor the execution of a program. A debugger can stop execution of a program being debugged, re-start it, set breakpoints in the program, and/or access or change values in memory. A debugger can enable a program to be run step by step (called stepping), to stop at a particular line of code when a breakpoint is encountered (breaking) and can enable the value of variables to be inspected when the program is at a breakpoint or while the program is running (inspection). Some debuggers can also modify program state while the program is running, in addition to observing and reporting on program state. Some debuggers can display and navigate the callstack, enabling the user to skip over parts of code while stepping, or to restart the execution from a potentially arbitrary line of code. Other functions of debuggers include listing and debugging multiple threads at the same time, enabling hit counting.
Hence, debuggers are typically very powerful. Moreover, the same functionality that makes a debugger useful for finding bugs also makes it useful as a software cracking tool to retrieve sensitive information, evade copy protection, circumvent digital rights management, and so on. Hence a user who does not have high-level privileges typically cannot run a debugger process.
When software running in a process is being debugged, other threads running in the process can be affected. For example, if a server process is being debugged, clients accessing the server may experience a slow down in server response time or the application being debugged (and all the clients accessing the application being debugged) may even freeze.